Lazy Evaluation এবং Range Adaptors

Computer Programming - সি++ স্ট্যান্ডার্ড লাইব্রেরি (C++ Standard Library) - Ranges Library (C++20 এ নতুন)
154

C++20 থেকে range-based algorithms এবং views সংক্রান্ত নতুন বৈশিষ্ট্যগুলি lazy evaluation এবং range adaptors নিয়ে কাজ করার সুযোগ দিয়েছে, যা C++ প্রোগ্রামিংকে আরও শক্তিশালী, নমনীয় এবং কার্যকর করে তোলে। এই নতুন বৈশিষ্ট্যগুলি বিশেষভাবে রেঞ্জ লাইব্রেরি (ranges library) এর মধ্যে আসে, যা এলিমেন্টের মধ্যে ক্রম অনুসারে কাজ করতে সাহায্য করে এবং বিভিন্ন ফাংশনাল প্রোগ্রামিং ধারণা বাস্তবায়ন করতে সহজ করে তোলে।

১. Lazy Evaluation এবং Range Adaptors

Lazy Evaluation:

Lazy Evaluation হল একটি কৌশল, যেখানে কোনো অপারেশন তখনই সম্পাদিত হয় যখন ফলাফলের প্রয়োজন পড়ে। এর মানে হল যে, অপারেশনগুলি বিলম্বিতভাবে বা প্রয়োজনে করা হয়। C++20 এ, ranges লাইব্রেরির ব্যবহারের মাধ্যমে lazy evaluation সম্ভব হয়েছে। যখন আপনি একটি রেঞ্জের উপরে কোনো ফাংশন বা অ্যালগরিদম প্রয়োগ করেন, তখন তা কেবলমাত্র যখন আপনি রেঞ্জের উপাদানগুলি অ্যাক্সেস করবেন তখনই কার্যকর হবে, আগে নয়।

Lazy evaluation সাধারণত range adaptors ব্যবহার করে করা হয়। Range adaptors ফাংশনাল অপারেশন বা রূপান্তর কেবল তখনই সম্পাদন করে যখন এটি প্রয়োজন, এবং এটি সম্পাদন না করে ফলাফল কেবল ধারণ করে রাখে। এতে প্রোগ্রাম আরো কার্যকরী ও দ্রুত হয়, কারণ এটি অতিরিক্ত অপ্রয়োজনীয় কাজ কমায়।

উদাহরণ: Lazy Evaluation with Range Adaptors

#include <iostream>
#include <vector>
#include <ranges>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5, 6};

    // lazy evaluation: transform applied only when iterating
    auto transformed = numbers 
                        | std::views::transform([](int n) { return n * 2; })
                        | std::views::filter([](int n) { return n % 2 == 0; });

    // Output elements lazily as we iterate over the result
    for (int n : transformed) {
        std::cout << n << " ";  // It will print only even results of the transformation
    }

    return 0;
}

আউটপুট:

4 8 12

এখানে, lazy evaluation ঘটছে, কারণ std::views::transform এবং std::views::filter কেবল তখনই কার্যকর হবে যখন রেঞ্জের উপাদানগুলি অ্যাক্সেস করা হবে, এবং প্রতিটি উপাদান একসাথে প্রসেস হবে না।


Range Adaptors:

Range adaptors হলো এমন ফাংশন বা কনসেপ্ট যা একটি রেঞ্জের উপাদানকে রূপান্তর করতে সহায়ক। এগুলি মূলত views এর অংশ, যা lazy evaluation এর সাহায্যে রেঞ্জের উপাদানগুলিতে বিভিন্ন ট্রান্সফর্মেশন, ফিল্টারিং, বা ম্যানিপুলেশন করে।

C++20 এর ranges লাইব্রেরিতে বিভিন্ন ধরনের range adaptors প্রদান করা হয়েছে যেমন:

  • std::views::transform: উপাদানগুলিকে রূপান্তর করা।
  • std::views::filter: উপাদানগুলিকে ফিল্টার করা।
  • std::views::reverse: রেঞ্জের উপাদানগুলিকে উল্টো করা।
  • std::views::take: রেঞ্জ থেকে নির্দিষ্ট সংখ্যক উপাদান নেয়া।
  • std::views::drop: রেঞ্জের উপাদানগুলো থেকে প্রথম কিছু উপাদান বাদ দেয়া।

২. Range Adaptors এর উদাহরণ

std::views::transform:

এটি রেঞ্জের প্রতিটি উপাদানকে একটি নির্দিষ্ট ফাংশন বা এক্সপ্রেশন দিয়ে রূপান্তর করে।

#include <iostream>
#include <vector>
#include <ranges>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};

    // Transform the numbers by multiplying each by 2
    auto transformed = numbers | std::views::transform([](int n) { return n * 2; });

    for (int n : transformed) {
        std::cout << n << " ";  // Output: 2 4 6 8 10
    }

    return 0;
}

আউটপুট:

2 4 6 8 10

এখানে, std::views::transform রেঞ্জের প্রতিটি উপাদানকে n * 2 দ্বারা রূপান্তর করছে, এবং এই প্রক্রিয়া কেবল তখনই করা হচ্ছে যখন উপাদানগুলি অ্যাক্সেস করা হচ্ছে।


std::views::filter:

এটি রেঞ্জ থেকে কিছু উপাদান ফিল্টার করে, যেমন কিছু শর্ত পূর্ণ হলে সেই উপাদানগুলো নির্বাচন করা হয়।

#include <iostream>
#include <vector>
#include <ranges>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5, 6};

    // Filter even numbers
    auto even_numbers = numbers | std::views::filter([](int n) { return n % 2 == 0; });

    for (int n : even_numbers) {
        std::cout << n << " ";  // Output: 2 4 6
    }

    return 0;
}

আউটপুট:

2 4 6

এখানে, std::views::filter শুধুমাত্র ইভেন (even) সংখ্যাগুলোই নির্বাচন করছে।


৩. Combining Multiple Range Adaptors

আপনি একাধিক range adaptors একসাথে ব্যবহার করতে পারেন। যেমন আপনি transform এবং filter একসাথে ব্যবহার করতে পারেন, যা একই রেঞ্জের উপাদানগুলোকে একাধিক রূপে প্রক্রিয়া করবে।

#include <iostream>
#include <vector>
#include <ranges>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5, 6};

    // Transform numbers by multiplying each by 2 and then filter the even ones
    auto transformed_and_filtered = numbers 
                                      | std::views::transform([](int n) { return n * 2; })
                                      | std::views::filter([](int n) { return n % 4 == 0; });

    for (int n : transformed_and_filtered) {
        std::cout << n << " ";  // Output: 4 8 12
    }

    return 0;
}

আউটপুট:

4 8 12

এখানে, প্রথমে প্রতিটি উপাদানকে n * 2 দিয়ে রূপান্তর করা হচ্ছে এবং তারপর শুধু n % 4 == 0 শর্ত পূর্ণকারী উপাদানগুলো filter করা হচ্ছে।


৪. Benefits of Lazy Evaluation and Range Adaptors

  • Performance: Lazy evaluation ফাংশনাল অপারেশনগুলিকে কেবল তখনই সম্পাদন করতে দেয় যখন সেগুলির ফলাফল প্রয়োজন হয়, যা অপ্রয়োজনীয় কাজ কমিয়ে দেয় এবং কর্মক্ষমতা বাড়ায়।
  • Memory Efficiency: Lazy evaluation ব্যবহারের ফলে, ডেটা একযোগে প্রক্রিয়া করার বদলে প্রয়োজনীয় অংশের উপরই কাজ করা হয়, যা মেমরি ব্যবস্থাপনাকে আরও কার্যকর করে।
  • Readability and Maintainability: Range adaptors ব্যবহার করে কোড আরও পরিষ্কার, সংক্ষিপ্ত এবং রিডেবল হয়, কারণ আপনি বড় বড় লুপ এবং ইফ স্টেটমেন্ট এড়াতে পারেন।

উপসংহার

Lazy Evaluation এবং Range Adaptors C++20-এ প্রবর্তিত শক্তিশালী ফিচার, যা প্রোগ্রামারদের আরও কার্যকরী এবং কার্যক্ষম কোড লিখতে সহায়ক। আপনি যখন range-based algorithms বা views ব্যবহার করেন, তখন আপনার কোড আরও সুন্দর এবং নমনীয় হয়ে ওঠে, এবং এর মাধ্যমে আপনি ডেটার উপর অত্যন্ত কার্যকরভাবে কাজ করতে পারেন।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...